home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 February / EnigmA AMIGA RUN 15 (1997)(G.R. Edizioni)(IT)[!][issue 1997-02][PLANET CD V].iso / enigma / earcd / varie / uae-0_64.lha / uae-0.6.4 / src / main.c < prev    next >
C/C++ Source or Header  |  1996-09-11  |  11KB  |  402 lines

  1.  /*
  2.   * UAE - The Un*x Amiga Emulator
  3.   * 
  4.   * Main program 
  5.   * 
  6.   * (c) 1995 Bernd Schmidt, Ed Hanway
  7.   */
  8.  
  9. #include "sysconfig.h"
  10. #include "sysdeps.h"
  11. #include <assert.h>
  12.  
  13. #include "config.h"
  14. #include "options.h"
  15. #include "memory.h"
  16. #include "custom.h"
  17. #include "serial.h"
  18. #include "newcpu.h"
  19. #include "disk.h"
  20. #include "debug.h"
  21. #include "xwin.h"
  22. #include "os.h"
  23. #include "keybuf.h"
  24. #include "gui.h"
  25. #include "zfile.h"
  26. #include "autoconf.h"
  27. #include "compiler.h"
  28.  
  29. int version = 100*UAEMAJOR + 10*UAEMINOR + UAEURSAMINOR;
  30. int framerate = 1;
  31. int use_debugger = 0;
  32. int illegal_mem = 0;
  33. int use_gfxlib = 0;
  34. int no_xhair = 0;
  35. int use_lores = 0;
  36. int use_serial = 0;
  37. int automount_uaedev = 1;
  38. int produce_sound = 0;
  39. int fake_joystick = 0;
  40. KbdLang keyboard_lang = KBD_LANG_US;
  41. int screen_res = 4;
  42. int correct_aspect = 0;
  43. int color_mode = 0;
  44. int sound_desired_bits = 16;
  45. int sound_desired_freq = 44100;
  46. int sound_desired_bsiz = 8192;
  47. int allow_save = 0;
  48. int no_gui = 0;
  49.  
  50. long hardfile_size = 0;
  51.  
  52. ULONG fastmem_size = 0x000000;
  53. ULONG chipmem_size = 0x200000;
  54. ULONG bogomem_size = 0x000000;
  55. char df0[256]="df0.adf", df1[256]="df1.adf", df2[256]="df2.adf", df3[256]="df3.adf";
  56. char romfile[256] = "kick.rom";
  57. #ifndef __DOS__
  58. char prtname[256] = "lpr ";
  59. #else
  60. char prtname[256] = "PRN";
  61. #endif
  62.  
  63. char optionsfile[256];
  64.  
  65. /* If you want to pipe Printer output to a file, put something like
  66.  * "cat >>printerfile.tmp" above.
  67.  * The printer support was only tested with the driver "PostScript" on
  68.  * Amiga side, using apsfilter for linux to print ps-data.
  69.  *
  70.  * Note for the DOS-Port: Maybe it's only neccesary to use a
  71.  * -p LPT1: or -p PRN: to print in a DOSBOX. I don't know,
  72.  * I do not use DOS... (please try) -=SR=-
  73.  */
  74.  
  75. /* People must provide their own name for this */
  76. char sername[256] = "";
  77.  
  78. /* And again: Serial lines work under Linux. I don't know
  79.  * how this behaves in other OSes. This is work for the porting
  80.  * people      -=SR=-
  81.  */
  82.  
  83. void usage(void)
  84. {
  85.     printf("UAE - The Un*x Amiga emulator\n");
  86.     printf("Summary of command-line options:\n");
  87.     printf("  -h                       : Print help\n");
  88.     printf("  -m VOLNAME:mount_point   : mount file system at <mount point> as AmigaDOS\n"
  89.        "                             volume VOLNAME:\n");
  90.     printf("  -M VOLNAME:mount_point   : like -m, but mount read-only\n");
  91.     printf("  -s n                     : Emulate n*256 KB slow memory at 0xC00000\n");
  92.     printf("  -c n                     : Emulate n*512 KB chip memory at 0x000000\n");
  93.     printf("  -F n                     : Emulate n MB fast memory at 0x200000\n");
  94.     printf("  -a                       : Add no expansion devices (disables fastmem and\n"
  95.        "                             harddisk support.\n");
  96.     printf("  -J                       : Fake joystick emulation with the numeric pad.\n");
  97.     printf("  -f n                     : Set the frame rate to 1/n\n");
  98.     printf("  -D                       : Start up the built-in debugger\n");
  99.     printf("  -i                       : Print illegal memory accesses\n");
  100.     printf("  -o                       : Allow options to be saved\n");
  101.     printf("  -G                       : Disable user interface\n");
  102.     printf("  -[0123] file             : Use file instead of df[0123].adf as disk image.e\n");
  103.     printf("  -r file                  : Use file as ROM image instead of kick.rom\n");
  104.     target_specific_usage();
  105. /*    printf("  -g                       : Turn on gfx-lib replacement (EXPERIMENTAL).\n");*/
  106.     printf("  -d mode                  : Select resolution with the mode parameter.\n");
  107.     printf("  -H mode                  : Set the number of colors with the mode parameter.\n");
  108.     printf("  -C                       : Use correct aspect display mode.\n");
  109.     printf("\n");
  110.     printf("Valid resolutions: 0 (320x200); 1 (320x240); 2 (320x400); 3 (640x480);\n"
  111.        "                   4 (800x600)\n"
  112.        "Valid color modes: 0 (256 colors); 1 (32768 colors); 2 (65536 colors)\n"
  113.        "                   3 (256 colors, with dithering for better results)\n"
  114.        "                   4 (16 colors, dithered); 5 (16 million colors)\n"
  115.        "UAE may choose to ignore the color mode/resolution setting.\n");
  116. }
  117.  
  118. #ifdef __unix
  119.  
  120. void parse_cmdline(int argc, char **argv)
  121. {
  122.     int c;
  123.     extern char *optarg;
  124.  
  125.     while(((c = getopt(argc, argv, "l:Dif:gd:hxF:as:c:S:Jm:M:0:1:2:3:r:H:p:CI:b:R:B:oG")) != EOF))
  126.     switch(c) {
  127.      case 'h': usage();    exit(0);
  128.  
  129.      case '0': strncpy(df0, optarg, 255); df0[255] = 0;    break;
  130.      case '1': strncpy(df1, optarg, 255); df1[255] = 0; break;
  131.      case '2': strncpy(df2, optarg, 255); df2[255] = 0; break;
  132.      case '3': strncpy(df3, optarg, 255); df3[255] = 0; break;
  133.      case 'r': strncpy(romfile, optarg, 255); romfile[255] = 0; break;
  134.      case 'p': strncpy(prtname, optarg, 255); prtname[255] = 0; break;
  135.      case 'I': strncpy(sername, optarg, 255); sername[255] = 0; use_serial = 1; break;
  136.      case 'm':
  137.      case 'M':
  138.     {
  139.         char buf[256];
  140.         char *s2;
  141.         int readonly = (c == 'M');
  142.  
  143.         strncpy(buf, optarg, 255); buf[255] = 0;
  144.         s2 = strchr(buf, ':');
  145.         if(s2) {
  146.         *s2++ = '\0';
  147. #ifdef __DOS__
  148.         {
  149.             char *tmp;
  150.  
  151.             while ((tmp = strchr(s2, '\\')))
  152.             *tmp = '/';
  153.         }
  154. #endif
  155.         add_filesys_unit(buf, s2, readonly);
  156.         } else {
  157.         fprintf(stderr, "Usage: [-m | -M] VOLNAME:/mount_point\n");
  158.         }
  159.     }
  160.     break;
  161.     
  162.      case 'S': produce_sound = atoi(optarg); break;
  163.      case 'f': framerate = atoi(optarg); break;
  164.      case 'x': no_xhair = 1; break;
  165.      case 'D': use_debugger = 1; break;
  166.      case 'i': illegal_mem = 1; break;
  167.      case 'J': fake_joystick = 1; break;
  168.      case 'a': automount_uaedev = 0; break;
  169.      case 'g': use_gfxlib = 1; break;
  170.      case 'C': correct_aspect = 1; break;
  171.      case 'o': allow_save = 1; break;
  172.      case 'G': no_gui = 1; break;
  173.  
  174.      case 'F':
  175.     fastmem_size = atoi(optarg) * 0x100000;
  176.     if (fastmem_size != 0x100000 && fastmem_size != 0x200000 
  177.         && fastmem_size != 0x400000 && fastmem_size != 0x800000) 
  178.     {
  179.         fastmem_size = 0;
  180.         fprintf(stderr, "Unsupported fastmem size!\n");
  181.     }    
  182.     break;
  183.  
  184.      case 's':
  185.     bogomem_size = atoi(optarg) * 0x40000;
  186.     if (bogomem_size != 0x80000 && bogomem_size != 0x100000
  187.         /* Braino && bogomem_size != 0x180000 && bogomem_size != 0x1C0000*/)
  188.     {
  189.         bogomem_size = 0;
  190.         fprintf(stderr, "Unsupported bogomem size!\n");
  191.     }
  192.     break;
  193.  
  194.      case 'c':
  195.     chipmem_size = atoi(optarg) * 0x80000;
  196.     if (chipmem_size != 0x80000 && chipmem_size != 0x100000
  197.         && chipmem_size != 0x200000)
  198.     {
  199.         chipmem_size = 0x200000;
  200.         fprintf(stderr, "Unsupported chipmem size!\n");
  201.     }
  202.     
  203.     break;
  204.  
  205.      case 'l':
  206.     if (0 == strcasecmp(optarg, "de"))
  207.         keyboard_lang = KBD_LANG_DE;
  208.     else if (0 == strcasecmp(optarg, "us"))
  209.         keyboard_lang = KBD_LANG_US;
  210.     else if (0 == strcasecmp(optarg, "se"))
  211.         keyboard_lang = KBD_LANG_SE;
  212.     else if (0 == strcasecmp(optarg, "fr"))
  213.         keyboard_lang = KBD_LANG_FR;
  214.     else if (0 == strcasecmp(optarg, "it"))
  215.         keyboard_lang = KBD_LANG_IT;
  216.     break;
  217.  
  218.      case 'd':
  219.     screen_res = atoi(optarg);
  220.     if (screen_res < 0 || screen_res > MAX_SCREEN_MODES) {
  221.         fprintf(stderr, "Bad video mode selected. Using default.\n");
  222.         screen_res = 3;
  223.     }
  224.     break;
  225.  
  226.      case 'H':
  227.     color_mode = atoi(optarg);
  228.     if (color_mode < 0 || color_mode > MAX_COLOR_MODES) {
  229.         fprintf(stderr, "Bad color mode selected. Using default.\n");
  230.         color_mode = 0;
  231.     }
  232.     break;
  233.  
  234.      case 'b': sound_desired_bits = atoi(optarg); break;
  235.      case 'B': sound_desired_bsiz = atoi(optarg); break;
  236.      case 'R': sound_desired_freq = atoi(optarg); break;
  237.     }
  238. }
  239. #endif
  240.  
  241. #ifndef __bebox__  /* BeOS needs its own startup code */
  242.  
  243. static void parse_cmdline_and_init_file(int argc, char **argv)
  244. {
  245.     FILE *f;
  246.     char *home;
  247.     char *buffer,*tmpbuf, *token;
  248.     char smallbuf[256];
  249.     int bufsiz, result;
  250.     int n_args;
  251.     char **new_argv;
  252.     int new_argc;
  253.  
  254.     strcpy(optionsfile,"");
  255.  
  256. #if !defined(__DOS__) && !defined(__mac__)
  257.     home = getenv("HOME");
  258.     if (home != NULL && strlen(home) < 240)
  259.     {
  260.     strcpy(optionsfile, home);
  261.     strcat(optionsfile, "/");
  262.     }
  263. #endif
  264.  
  265. #ifndef __DOS__
  266.     strcat(optionsfile, ".uaerc");
  267. #else
  268.     strcat(optionsfile, "uae.rc");
  269. #endif
  270.  
  271.     f = fopen(optionsfile,"r");
  272.     if (f == NULL) {
  273.     parse_cmdline(argc, argv);
  274.     return;
  275.     }
  276.     fseek(f, 0, SEEK_END);
  277.     bufsiz = ftell(f);
  278.     fseek(f, 0, SEEK_SET);
  279.  
  280.     buffer = (char *)malloc(bufsiz+1);
  281.     buffer[bufsiz] = 0;
  282.     if (fread(buffer, 1, bufsiz, f) < bufsiz) {
  283.     fprintf(stderr, "Error reading configuration file\n");
  284.     fclose(f);
  285.     parse_cmdline(argc, argv);
  286.     return;
  287.     }
  288.     fclose(f);
  289.  
  290. #ifdef __DOS__
  291.     {
  292.     char *tmp;
  293.  
  294.     while ((tmp = strchr(buffer, 0x0d)))
  295.         *tmp = ' ';
  296.     while ((tmp = strchr(buffer, 0x0a)))
  297.         *tmp = ' ';
  298.     while (buffer[0] == ' ')
  299.         strcpy(buffer, buffer+1);
  300.     while ((strlen(buffer) > 0) && (buffer[strlen(buffer) - 1] == ' '))
  301.         buffer[strlen(buffer) - 1] = '\0';
  302.     while ((tmp = strstr(buffer, "  ")))
  303.         strcpy(tmp, tmp+1);
  304.     }
  305. #endif
  306.  
  307.     tmpbuf = my_strdup (buffer);
  308.  
  309.     n_args = 0;
  310.     if (strtok(tmpbuf, "\n ") != NULL) {
  311.     do {
  312.         n_args++;
  313.     } while (strtok(NULL, "\n ") != NULL);
  314.     }
  315.     free (tmpbuf);
  316.  
  317.     new_argv = (char **)malloc ((1 + n_args + argc) * sizeof (char **));
  318.     new_argv[0] = argv[0];
  319.     new_argc = 1;
  320.  
  321.     token = strtok(buffer, "\n ");
  322.     while (token != NULL) {
  323.     new_argv[new_argc] = my_strdup (token);
  324.     new_argc++;
  325.     token = strtok(NULL, "\n ");
  326.     }
  327.     for (n_args = 1; n_args < argc; n_args++)
  328.     new_argv[new_argc++] = argv[n_args];
  329.     new_argv[new_argc] = NULL;
  330.     parse_cmdline(new_argc, new_argv);
  331. }
  332.  
  333. static int ARE_YOU_NUTS = 0;
  334.  
  335. int main(int argc, char **argv)
  336. {
  337.     FILE *hf;
  338.  
  339.     hf = fopen("hardfile", "rb");
  340.     if (hf == NULL)
  341.          hardfile_size = 0;
  342.     else {
  343.         fseek(hf, 0, SEEK_END);
  344.         hardfile_size = ftell(hf);
  345.         fclose(hf);
  346.     }
  347.     rtarea_init ();
  348.     hardfile_install ();
  349.  
  350.     parse_cmdline_and_init_file(argc, argv);
  351.     if (!init_sound()) {
  352.     fprintf(stderr, "Sound driver unavailable: Sound output disabled\n");
  353.     produce_sound = 0;
  354.     }
  355.  
  356.     if (!no_gui && gui_init() < 0) {
  357.     fprintf(stderr, "Failed to initialize the GUI\n");
  358.     /* abort()? Maybe. */
  359.     }
  360.     init_joystick();
  361.     keybuf_init();
  362.     
  363.     expansion_init ();
  364.     memory_init();
  365.  
  366.     filesys_install();
  367.     execlib_install();
  368.     gfxlib_install();
  369.     emulib_install();
  370.  
  371.     custom_init();
  372.     serial_init();
  373.     DISK_init();
  374.     init_m68k();
  375.     compiler_init();
  376.     
  377.     /* We ought to know this by now */
  378.     use_lores = screen_res < 3;
  379.     
  380.     if (graphics_init()) {
  381.     m68k_reset();
  382.     
  383.     setup_brkhandler();
  384.     if (use_debugger && debuggable())
  385.         activate_debugger();
  386.     if (ARE_YOU_NUTS)
  387.         execlib_sysinit();
  388.     else
  389.         m68k_go(1);
  390.     
  391.     graphics_leave();
  392.     close_joystick();
  393.     }
  394.     dump_counts();
  395.     serial_exit();
  396.     zfile_exit();
  397.     if (!no_gui)
  398.     gui_exit();
  399.     return 0;
  400. }
  401. #endif /* not __bebox__ */
  402.